﻿using System;


namespace Teal.Compiler {

    /// <summary>
    /// 对基础类型的枚举。
    /// </summary>
    public enum PrimitiveType {

        /// <summary>
        /// 表示非基础类型。
        /// </summary>
        none,

        /// <summary>
        /// 表示字节。
        /// </summary>
        @byte,

        /// <summary>
        /// 表示布尔型。
        /// </summary>
        @bool,

        /// <summary>
        /// 表示 Unicode 字符。
        /// </summary>
        @char,

        /// <summary>
        /// 表示 16 位有符号整数。
        /// </summary>
        int16,

        /// <summary>
        /// 表示 16 位无符号整数。
        /// </summary>
        uint16,

        /// <summary>
        /// 表示 32 位有符号整数。
        /// </summary>
        int32,

        /// <summary>
        /// 表示 32 位无符号整数。
        /// </summary>
        uint32,

        /// <summary>
        /// 表示 64 位有符号整数。
        /// </summary>
        int64,

        /// <summary>
        /// 表示 64 位无符号整数。
        /// </summary>
        uint64,

        /// <summary>
        /// 表示 32 位浮点数。
        /// </summary>
        float32,

        /// <summary>
        /// 表示 64 位浮点数。
        /// </summary>
        float64,

        /// <summary>
        /// 表示指针。
        /// </summary>
        ptr,

    }

    /// <summary>
    /// 对 PrimitiveType 的扩展。
    /// </summary>
    public static class PrimitiveTypeExtensions {

        /// <summary>
        /// 获取当前基础类型对应的名字。
        /// </summary>
        /// <param name="primitiveType"></param>
        /// <returns></returns>
        public static string getName(this PrimitiveType primitiveType) {
            switch (primitiveType) {
                case PrimitiveType.int32:
                    return "int";
                case PrimitiveType.@byte:
                    return "byte";
                case PrimitiveType.int16:
                    return "short";
                case PrimitiveType.uint16:
                    return "ushort";
                case PrimitiveType.@char:
                    return "char";
                case PrimitiveType.uint32:
                    return "uint";
                case PrimitiveType.int64:
                    return "long";
                case PrimitiveType.uint64:
                    return "ulong";
                case PrimitiveType.float32:
                    return "float";
                case PrimitiveType.float64:
                    return "double";
                case PrimitiveType.@bool:
                    return "bool";
                case PrimitiveType.ptr:
                    return "void*";
                default:
                    throw new Unreachable();
            }
        }

    }

}